/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * JFrameNovaVenda.java
 *
 * Created on 15/11/2011, 21:36:06
 */
package gui.fiscal;

import banco.estoque.BancoProduto;
import banco.estoque.BancoVenda;
import banco.pessoa.BancoCliente;
import banco.pessoa.BancoFuncionario;
import excecoes.estoque.DinheiroNegativoException;
import excecoes.estoque.NenhumProdutoEncontradoException;
import excecoes.estoque.QuantidadeNegativaException;
import excecoes.fiscal.CodigoInvalidoException;
import excecoes.pessoa.CpfCnpjExistenteException;
import excecoes.pessoa.CpfCnpjInvalidoException;
import excecoes.pessoa.LocalizacaoInvalidaException;
import excecoes.pessoa.NomeInvalidoException;
import java.awt.event.KeyEvent;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import smartMarket.estoque.Produto;
import smartMarket.fiscal.Venda;
import smartMarket.pessoa.Cliente;
import smartMarket.pessoa.Funcionario;

/**
 *
 * @author dyego
 */
public class JFrameNovaVenda extends javax.swing.JFrame {

    // Atributos
    private Venda venda = new Venda();
    private Produto produto;
    private BancoProduto bancoProduto;
    private String entrada0;
    private String entrada2;
    private String entrada3;
    private boolean verificarCodigoDeBarra;

    /** Creates new form JFrameNovaVenda */
    public JFrameNovaVenda() {
        initComponents();
        BancoVenda bv = new BancoVenda();
        try {
            jTextFieldNumero.setText("" + (bv.ultimaVenda() + 1));
        } catch (SQLException ex) {
            Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // MÃ©todos
    private void setInformacoesClientePorCodigo() throws NullPointerException, SQLException, NomeInvalidoException, DinheiroNegativoException, CpfCnpjInvalidoException {

        BancoCliente bc = new BancoCliente();
        Cliente cliente;
        Integer codigoCliente;

        String cpfCliente = jFormattedTextFieldCPF.getText();

        if ("".equals(jTextFieldCodigoCliente.getText())) {
            codigoCliente = null;
            JOptionPane.showMessageDialog(null, jTextFieldCodigoCliente.getText());
        } else {
            codigoCliente = Integer.parseInt(jTextFieldCodigoCliente.getText());
        }


        if (!(codigoCliente == null)) {
            try {
            
                cliente = bc.buscar(codigoCliente);
                jFormattedTextFieldCPF.setText(cliente.getCPF_CNPJ());
                jTextFieldNomeCliente.setText(cliente.getNome());
           
            } catch (CpfCnpjExistenteException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (LocalizacaoInvalidaException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            }



        } else {
            jTextFieldCodigoCliente.setText("");
            jFormattedTextFieldCPF.setText("");
            jTextFieldNomeCliente.setText("");
        }



    }

    private void setInformacoesClientePorCPF() throws NullPointerException, SQLException, NomeInvalidoException, DinheiroNegativoException, CpfCnpjInvalidoException {

        BancoCliente bc = new BancoCliente();
        Cliente cliente;
        Integer codigoCliente;

        String cpfCliente = jFormattedTextFieldCPF.getText();

        //if (jTextFieldCodigoCliente.getText().equals("")) {
        if ("".equals(jTextFieldCodigoCliente.getText())) {

            codigoCliente = null;
        } else {
            codigoCliente = Integer.parseInt(jTextFieldCodigoCliente.getText());
        }


        if (!(cpfCliente.equals(""))) {
            try {
                cliente = bc.buscar(cpfCliente);
                jTextFieldCodigoCliente.setText("" + cliente.getCodigo());
                jTextFieldNomeCliente.setText(cliente.getNome());
            } catch (CpfCnpjExistenteException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (LocalizacaoInvalidaException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            }


        } else {
            jTextFieldCodigoCliente.setText("");
            jFormattedTextFieldCPF.setText("");
            jTextFieldNomeCliente.setText("");
        }
    }


    private void setInformacoesVendedor() throws NullPointerException, SQLException, NomeInvalidoException, CpfCnpjInvalidoException {

        try {
            BancoFuncionario bf = new BancoFuncionario();
            int codigoVendedor = Integer.parseInt(jTextFieldCodigoVendedor.getText());
            Funcionario funcionario;
            funcionario = bf.buscar(codigoVendedor);
            jTextFieldNomeVendedor.setText(funcionario.getNome());
        } catch (DinheiroNegativoException ex) {
            Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
        } catch (CpfCnpjExistenteException ex) {
            Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
        } catch (LocalizacaoInvalidaException ex) {
            Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    private void substituirValor() throws NumberFormatException, SQLException, DinheiroNegativoException, QuantidadeNegativaException,
            NenhumProdutoEncontradoException {

        int linhaSelecionada = jTableProdutos.getSelectedRow();

        // Obtem o modelo da JTable  
        DefaultTableModel modelo = (DefaultTableModel) jTableProdutos.getModel();

        // Obtem o valor atual na coluna  
        String sValor0 = "" + modelo.getValueAt(linhaSelecionada, 0);

        if (!sValor0.equals(entrada0) && !sValor0.equals("")) {
            BancoProduto bp = new BancoProduto();

            try {

                int codigo = Integer.parseInt(sValor0);

                Produto prod = bp.buscar(codigo);


                modelo.setValueAt(prod.getDescricao(), linhaSelecionada, 1);
                modelo.setValueAt(1, linhaSelecionada, 2);
                modelo.setValueAt(prod.getPreco(), linhaSelecionada, 3);
                modelo.setValueAt(prod.getPreco(), linhaSelecionada, 4);
 
                try {
                    venda.addCarrinho(codigo, 1, prod.getPreco());
                } catch (CodigoInvalidoException ex) {
                    Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
                }

               


            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (DinheiroNegativoException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (QuantidadeNegativaException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NenhumProdutoEncontradoException e) {//nao encontrado pelo codigo
                verificarCodigoDeBarra = true;
                e.printStackTrace();
            } catch (IllegalArgumentException e) {//nao foi possivel converter o codigo
                verificarCodigoDeBarra = true;
                e.printStackTrace();
            }

            if (verificarCodigoDeBarra) {
                System.out.println("3");
                verificarCodigoDeBarra = false;

                try {


                    Produto prod = bp.buscar(sValor0);

                    System.out.println("4");
                    modelo.setValueAt(prod.getCodigo(), linhaSelecionada, 0);
                    modelo.setValueAt(prod.getDescricao(), linhaSelecionada, 1);
                    modelo.setValueAt("" + 1, linhaSelecionada, 2);
                    modelo.setValueAt(prod.getPreco(), linhaSelecionada, 3);
                    modelo.setValueAt(prod.getPreco(), linhaSelecionada, 4);

                    System.out.println("5");
                    venda.addCarrinho(prod.getCodigo(), 1, prod.getPreco());
                    System.out.println("6");

                } catch (NumberFormatException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SQLException e) {
                    //                    new JFrameTelaErro(e.getMessage()).setVisible(true);///
                } catch (DinheiroNegativoException dne) {
                    JOptionPane.showMessageDialog(null, dne.getMessage());
                } catch (QuantidadeNegativaException qne) {
                    JOptionPane.showMessageDialog(null, qne.getMessage());
                } catch (NenhumProdutoEncontradoException e) {
                    modelo.removeRow(linhaSelecionada);
                    //                    new JFrameTelaErro(e.getMessage()).setVisible(true);
                } catch (CodigoInvalidoException cie) {
                    JOptionPane.showMessageDialog(null, cie.getMessage());
                }
            }
        }
        System.out.println("7");
        if (!sValor0.equals("")) {
            System.out.println("8");
            String sValor2 = "" + modelo.getValueAt(linhaSelecionada, 2);
            String sValor3 = "" + modelo.getValueAt(linhaSelecionada, 3);

            if (!sValor2.equals(entrada2) || !sValor3.equals(entrada3)) {
                try {
                    System.out.println("9");

                    int codigo = Integer.parseInt(sValor0);

                    int qtd = Integer.parseInt(sValor2);

                    float preco = Float.parseFloat(sValor3);

                    float valor = preco * qtd;
                    System.out.println("10");
                    venda.alterarCarrinho(codigo, qtd, preco);
                    System.out.println("11");
                    modelo.setValueAt(valor, linhaSelecionada, 4);



                } catch (IllegalArgumentException iae) {

                    modelo.setValueAt(entrada2, linhaSelecionada, 1);
                    modelo.setValueAt(entrada3, linhaSelecionada, 2);
                    //MENSAGEM
                } catch (DinheiroNegativoException dne) {
                    JOptionPane.showMessageDialog(null, dne.getMessage());
                    modelo.setValueAt(0.01, linhaSelecionada, 3);
                } catch (QuantidadeNegativaException qne) {
                    JOptionPane.showMessageDialog(null, qne.getMessage());
                    modelo.setValueAt("1", linhaSelecionada, 2);
                }
                
                
                
            }//
        } else {
            System.out.println("12");
            int codigo = Integer.parseInt(entrada0);
            int qtd = Integer.parseInt(entrada3);
            modelo.removeRow(linhaSelecionada);
            venda.removeCarrinho(codigo, qtd);

            System.out.println("13");
        }

        
        //Setar total
        System.out.println("Valor total: " + venda.getValorTotal());
        jFormattedTextFieldTotal.setText("" + venda.getValorTotal());
        
    }

    private void setDesconto() {
        Float desconto;

        if ("".equals(null + jFormattedTextFieldDesconto.getText())) {
            desconto = 0.0f;
            jFormattedTextFieldDesconto.setText("0.00");
        } else {
            
            try {
                
                desconto = Float.parseFloat(jFormattedTextFieldDesconto.getText());
                venda.setDesconto(desconto);
                jFormattedTextFieldTotal.setText("" + venda.getValorTotal());
                
            } catch (DinheiroNegativoException dne) {
                JOptionPane.showMessageDialog(null, dne.getMessage());
                jFormattedTextFieldDesconto.setText("0.00");
            } catch (Exception e) {
                jFormattedTextFieldDesconto.setText("0.00");
            }
            
        }  
        
    }

    private void setVenda() throws SQLException, NomeInvalidoException, NullPointerException, DinheiroNegativoException, CpfCnpjInvalidoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        BancoCliente bc = new BancoCliente();
        BancoFuncionario bf = new BancoFuncionario();
        Cliente cliente;

        //set cliente na venda
        String sCodigoCliente = "" + jTextFieldCodigoCliente.getText();

        if ("".equals(sCodigoCliente)) {
            //CHAMAR A JANELA DE ERRO
        } else {
            
            try {
                Integer codigoCliente = Integer.parseInt(sCodigoCliente);
                cliente = bc.buscar(codigoCliente);
                venda.setCliente(cliente);
            } catch (CpfCnpjExistenteException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (LocalizacaoInvalidaException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }

        //set vendedor na venda
        String sCodigoVendedor = "" + jTextFieldCodigoVendedor.getText();


        if ("".equals(sCodigoVendedor)) {
            //CHAMAR A JANELA DE ERRO
        } else {
            Integer codigoVendedor = Integer.parseInt(jTextFieldCodigoVendedor.getText());
            Funcionario vendedor = bf.buscar(codigoVendedor);
            venda.setVendedor(vendedor);
        }

        //set informações da nota     OBS: 
        String data = "" + jFormattedTextFieldDataEntrada.getText();
        if ("".equals(data)) {
            //CHAMAR A JANELA DE ERRO
        } else {
            venda.setData(data);
        }

        String sNumero = "" + jTextFieldNumero.getText();
        if ("".equals(sNumero)) {
            //CHAMAR A JANELA DE ERRO
        } else {
            venda.setNumero(Integer.parseInt(sNumero));
        }
    }

    public void cadastrar() throws SQLException {
        BancoVenda bv = new BancoVenda();
        bv.novo(this.venda);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanelInformacoesCliente = new javax.swing.JPanel();
        jLabelCodigoCliente = new javax.swing.JLabel();
        jLabelNomeCliente = new javax.swing.JLabel();
        jTextFieldCodigoCliente = new javax.swing.JTextField();
        jTextFieldNomeCliente = new javax.swing.JTextField();
        jLabelCPFCliente = new javax.swing.JLabel();
        jFormattedTextFieldCPF = new javax.swing.JFormattedTextField();
        jButtonFinalizarVenda = new javax.swing.JButton();
        jButtonCancelar = new javax.swing.JButton();
        jPanelTotal = new javax.swing.JPanel();
        jLabelTotal = new javax.swing.JLabel();
        jFormattedTextFieldDesconto = new javax.swing.JFormattedTextField();
        jLabelDesconto = new javax.swing.JLabel();
        jFormattedTextFieldTotal = new javax.swing.JFormattedTextField();
        jScrollPaneProdutos = new javax.swing.JScrollPane();
        jTableProdutos = new javax.swing.JTable();
        jPanelInformacoesNota = new javax.swing.JPanel();
        jLabelNumero = new javax.swing.JLabel();
        jLabelDataSaida = new javax.swing.JLabel();
        jTextFieldNumero = new javax.swing.JTextField();
        jFormattedTextField1 = new javax.swing.JFormattedTextField();
        jFormattedTextFieldDataEntrada = new javax.swing.JFormattedTextField();
        jPanelInformacoesVendedor = new javax.swing.JPanel();
        jLabelVendedor = new javax.swing.JLabel();
        jLabelNomeVendedor = new javax.swing.JLabel();
        jTextFieldCodigoVendedor = new javax.swing.JTextField();
        jTextFieldNomeVendedor = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jPanelInformacoesCliente.setBorder(javax.swing.BorderFactory.createTitledBorder("Informações do Cliente"));

        jLabelCodigoCliente.setText("Código:");

        jLabelNomeCliente.setText("Nome:");

        jTextFieldCodigoCliente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextFieldCodigoClienteActionPerformed(evt);
            }
        });
        jTextFieldCodigoCliente.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                jTextFieldCodigoClienteFocusLost(evt);
            }
        });
        jTextFieldCodigoCliente.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jTextFieldCodigoClienteKeyPressed(evt);
            }
            public void keyReleased(java.awt.event.KeyEvent evt) {
                jTextFieldCodigoClienteKeyReleased(evt);
            }
        });

        jTextFieldNomeCliente.setEditable(false);
        jTextFieldNomeCliente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextFieldNomeClienteActionPerformed(evt);
            }
        });

        jLabelCPFCliente.setText("CPF:");

        jFormattedTextFieldCPF.setEditable(false);
        try {
            jFormattedTextFieldCPF.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("###.###.###-##")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }

        javax.swing.GroupLayout jPanelInformacoesClienteLayout = new javax.swing.GroupLayout(jPanelInformacoesCliente);
        jPanelInformacoesCliente.setLayout(jPanelInformacoesClienteLayout);
        jPanelInformacoesClienteLayout.setHorizontalGroup(
            jPanelInformacoesClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacoesClienteLayout.createSequentialGroup()
                .addGroup(jPanelInformacoesClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelInformacoesClienteLayout.createSequentialGroup()
                        .addGap(16, 16, 16)
                        .addComponent(jLabelNomeCliente))
                    .addGroup(jPanelInformacoesClienteLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabelCodigoCliente)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelInformacoesClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(jPanelInformacoesClienteLayout.createSequentialGroup()
                        .addComponent(jTextFieldCodigoCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(21, 21, 21)
                        .addComponent(jLabelCPFCliente)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jFormattedTextFieldCPF, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jTextFieldNomeCliente))
                .addContainerGap(26, Short.MAX_VALUE))
        );
        jPanelInformacoesClienteLayout.setVerticalGroup(
            jPanelInformacoesClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacoesClienteLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelInformacoesClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelCodigoCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelCPFCliente)
                    .addComponent(jTextFieldCodigoCliente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jFormattedTextFieldCPF, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanelInformacoesClienteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelNomeCliente)
                    .addComponent(jTextFieldNomeCliente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(32, Short.MAX_VALUE))
        );

        jButtonFinalizarVenda.setText("Finalizar Venda");
        jButtonFinalizarVenda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonFinalizarVendaActionPerformed(evt);
            }
        });

        jButtonCancelar.setText("Cancelar");
        jButtonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonCancelarActionPerformed(evt);
            }
        });

        jPanelTotal.setBorder(javax.swing.BorderFactory.createTitledBorder("Total"));

        jLabelTotal.setText("Total:");

        jFormattedTextFieldDesconto.setText("0,00");
        jFormattedTextFieldDesconto.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                jFormattedTextFieldDescontoFocusLost(evt);
            }
        });

        jLabelDesconto.setText("Desconto:");

        jFormattedTextFieldTotal.setEditable(false);
        jFormattedTextFieldTotal.setText("0,00");

        javax.swing.GroupLayout jPanelTotalLayout = new javax.swing.GroupLayout(jPanelTotal);
        jPanelTotal.setLayout(jPanelTotalLayout);
        jPanelTotalLayout.setHorizontalGroup(
            jPanelTotalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelTotalLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelDesconto)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jFormattedTextFieldDesconto, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(45, 45, 45)
                .addComponent(jLabelTotal)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jFormattedTextFieldTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelTotalLayout.setVerticalGroup(
            jPanelTotalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelTotalLayout.createSequentialGroup()
                .addGroup(jPanelTotalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jFormattedTextFieldDesconto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelTotal)
                    .addComponent(jFormattedTextFieldTotal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelDesconto))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jScrollPaneProdutos.setBorder(javax.swing.BorderFactory.createTitledBorder("Produtos"));

        jTableProdutos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "Código", "Descrição", "Quantidade", "Preço", "Total"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.Object.class, java.lang.Integer.class, java.lang.Float.class, java.lang.Float.class
            };
            boolean[] canEdit = new boolean [] {
                true, false, true, true, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTableProdutos.addContainerListener(new java.awt.event.ContainerAdapter() {
            public void componentAdded(java.awt.event.ContainerEvent evt) {
                jTableProdutosComponentAdded(evt);
            }
            public void componentRemoved(java.awt.event.ContainerEvent evt) {
                jTableProdutosComponentRemoved(evt);
            }
        });
        jScrollPaneProdutos.setViewportView(jTableProdutos);

        jPanelInformacoesNota.setBorder(javax.swing.BorderFactory.createTitledBorder("Informações da Nota"));

        jLabelNumero.setText("Número:");

        jLabelDataSaida.setText("Data da Saída:");

        jTextFieldNumero.setEditable(false);

        jFormattedTextField1.setText("jFormattedTextField1");

        try {
            jFormattedTextFieldDataEntrada.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }

        javax.swing.GroupLayout jPanelInformacoesNotaLayout = new javax.swing.GroupLayout(jPanelInformacoesNota);
        jPanelInformacoesNota.setLayout(jPanelInformacoesNotaLayout);
        jPanelInformacoesNotaLayout.setHorizontalGroup(
            jPanelInformacoesNotaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacoesNotaLayout.createSequentialGroup()
                .addGap(32, 32, 32)
                .addGroup(jPanelInformacoesNotaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabelDataSaida)
                    .addComponent(jLabelNumero))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelInformacoesNotaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jTextFieldNumero)
                    .addComponent(jFormattedTextFieldDataEntrada, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(39, 39, 39)
                .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelInformacoesNotaLayout.setVerticalGroup(
            jPanelInformacoesNotaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacoesNotaLayout.createSequentialGroup()
                .addGroup(jPanelInformacoesNotaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelInformacoesNotaLayout.createSequentialGroup()
                        .addGap(58, 58, 58)
                        .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanelInformacoesNotaLayout.createSequentialGroup()
                        .addGroup(jPanelInformacoesNotaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabelNumero)
                            .addComponent(jTextFieldNumero, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(jPanelInformacoesNotaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabelDataSaida)
                            .addComponent(jFormattedTextFieldDataEntrada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(26, Short.MAX_VALUE))
        );

        jPanelInformacoesVendedor.setBorder(javax.swing.BorderFactory.createTitledBorder("Informações do Vendedor"));

        jLabelVendedor.setText("Código:");

        jLabelNomeVendedor.setText("Nome:");

        jTextFieldCodigoVendedor.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                jTextFieldCodigoVendedorFocusLost(evt);
            }
        });
        jTextFieldCodigoVendedor.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jTextFieldCodigoVendedorKeyPressed(evt);
            }
        });

        jTextFieldNomeVendedor.setEditable(false);

        javax.swing.GroupLayout jPanelInformacoesVendedorLayout = new javax.swing.GroupLayout(jPanelInformacoesVendedor);
        jPanelInformacoesVendedor.setLayout(jPanelInformacoesVendedorLayout);
        jPanelInformacoesVendedorLayout.setHorizontalGroup(
            jPanelInformacoesVendedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacoesVendedorLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelVendedor)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldCodigoVendedor, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 142, Short.MAX_VALUE)
                .addComponent(jLabelNomeVendedor)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldNomeVendedor, javax.swing.GroupLayout.PREFERRED_SIZE, 426, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanelInformacoesVendedorLayout.setVerticalGroup(
            jPanelInformacoesVendedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacoesVendedorLayout.createSequentialGroup()
                .addGroup(jPanelInformacoesVendedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelVendedor)
                    .addComponent(jTextFieldCodigoVendedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelNomeVendedor)
                    .addComponent(jTextFieldNomeVendedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jPanelTotal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 287, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jButtonCancelar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButtonFinalizarVenda)))
                    .addComponent(jScrollPaneProdutos, javax.swing.GroupLayout.DEFAULT_SIZE, 815, Short.MAX_VALUE)
                    .addComponent(jPanelInformacoesVendedor, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanelInformacoesCliente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 95, Short.MAX_VALUE)
                        .addComponent(jPanelInformacoesNota, javax.swing.GroupLayout.PREFERRED_SIZE, 269, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(24, 24, 24))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jPanelInformacoesNota, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanelInformacoesCliente, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(15, 15, 15)
                .addComponent(jPanelInformacoesVendedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jScrollPaneProdutos, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButtonFinalizarVenda)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButtonCancelar))
                    .addComponent(jPanelTotal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void jTextFieldCodigoClienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextFieldCodigoClienteActionPerformed


}//GEN-LAST:event_jTextFieldCodigoClienteActionPerformed

private void jTextFieldNomeClienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextFieldNomeClienteActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_jTextFieldNomeClienteActionPerformed

private void jButtonFinalizarVendaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonFinalizarVendaActionPerformed
    if(jTextFieldCodigoCliente.getText().equals("")){
        JOptionPane.showMessageDialog(null, "Informar Cliente");
        return;        
    }
    if (jTextFieldCodigoVendedor.getText().equals("")){
        JOptionPane.showMessageDialog(null, "Informar Vendedor");
        return;                
    }
    if (jFormattedTextFieldTotal.getText().equals("0,00")){
        JOptionPane.showMessageDialog(null, "Informar Produtos");
        return;                
    }
    
    if (jFormattedTextFieldDataEntrada.getText().equals("  /  /    ")){
        JOptionPane.showMessageDialog(null, "Informar Data");
        return;
    }
    
    boolean cadastrar = false;

    try {
        try {
            setVenda();
            cadastrar = true;
            
        } catch (CpfCnpjExistenteException ex) {
            Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
        } catch (LocalizacaoInvalidaException ex) {
            Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    } catch (NullPointerException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (NomeInvalidoException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (DinheiroNegativoException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (CpfCnpjInvalidoException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    if (cadastrar) {
        try {
            cadastrar();
            this.setVisible(false);

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}//GEN-LAST:event_jButtonFinalizarVendaActionPerformed

private void jButtonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCancelarActionPerformed
    this.setVisible(false);
}//GEN-LAST:event_jButtonCancelarActionPerformed

private void jTextFieldCodigoClienteFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldCodigoClienteFocusLost

}//GEN-LAST:event_jTextFieldCodigoClienteFocusLost

private void jTextFieldCodigoVendedorFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldCodigoVendedorFocusLost

}//GEN-LAST:event_jTextFieldCodigoVendedorFocusLost

private void jTableProdutosComponentAdded(java.awt.event.ContainerEvent evt) {//GEN-FIRST:event_jTableProdutosComponentAdded
    int linhaSelecionada = jTableProdutos.getSelectedRow();

    // Obtem o modelo da JTable  
    DefaultTableModel modelo = (DefaultTableModel) jTableProdutos.getModel();
    entrada0 = "" + modelo.getValueAt(linhaSelecionada, 0);
    entrada2 = "" + modelo.getValueAt(linhaSelecionada, 1);
    entrada3 = "" + modelo.getValueAt(linhaSelecionada, 2);
}//GEN-LAST:event_jTableProdutosComponentAdded

private void jTableProdutosComponentRemoved(java.awt.event.ContainerEvent evt) {//GEN-FIRST:event_jTableProdutosComponentRemoved
    try {
        substituirValor();
    } catch (NumberFormatException ex) {
        Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
    } catch (DinheiroNegativoException ex) {
        Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
    } catch (QuantidadeNegativaException ex) {
        Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NenhumProdutoEncontradoException ex) {
        Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
    }
}//GEN-LAST:event_jTableProdutosComponentRemoved

private void jFormattedTextFieldDescontoFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jFormattedTextFieldDescontoFocusLost
    setDesconto();
}//GEN-LAST:event_jFormattedTextFieldDescontoFocusLost

private void jTextFieldCodigoClienteKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldCodigoClienteKeyPressed
    // TODO add your handling code here:        
    if(evt.getKeyCode()== evt.VK_ENTER){
        boolean buscar = true;
        if(jTextFieldCodigoCliente.getText().equals("")){
            JOptionPane.showMessageDialog(null, "Favor informar codigo do cliente");
            buscar=false;
        }
        BancoCliente bc = new BancoCliente();
        String codigoCliente=jTextFieldCodigoCliente.getText();
            try {
                Cliente cli = bc.buscar(Integer.parseInt(codigoCliente));
                setInformacoesClientePorCodigo();
            } catch (SQLException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NullPointerException ex) {//Entrou nessa Exception é porque não foi encontrado nenhum cliente
                JOptionPane.showMessageDialog(null, "Cliente não cadastrado");
                return; //Não executa o resto do código
            } catch (NomeInvalidoException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (DinheiroNegativoException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (CpfCnpjInvalidoException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (CpfCnpjExistenteException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (LocalizacaoInvalidaException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            }catch(NumberFormatException ex){
                JOptionPane.showMessageDialog(null, "Favor informar apenas números");                
                return;
            }              
    }
}//GEN-LAST:event_jTextFieldCodigoClienteKeyPressed

private void jTextFieldCodigoVendedorKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldCodigoVendedorKeyPressed
    // TODO add your handling code here:
    if(evt.getKeyCode()== evt.VK_ENTER){    
        BancoFuncionario bf = new BancoFuncionario();
        String codigoFunci = jTextFieldCodigoVendedor.getText();
            try {
                Funcionario fun = bf.buscar(Integer.parseInt(codigoFunci));
                setInformacoesVendedor();
            } catch (SQLException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NullPointerException ex) {
                JOptionPane.showMessageDialog(null, "Vendedor não encontrado");
                return;
            } catch (NomeInvalidoException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (CpfCnpjInvalidoException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (DinheiroNegativoException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (CpfCnpjExistenteException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (LocalizacaoInvalidaException ex) {
                Logger.getLogger(JFrameNovaVenda.class.getName()).log(Level.SEVERE, null, ex);
            }catch(NumberFormatException ex){
                JOptionPane.showMessageDialog(null, "Favor informar apenas números");                
                return;
            }          
    }
}//GEN-LAST:event_jTextFieldCodigoVendedorKeyPressed

private void jTextFieldCodigoClienteKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldCodigoClienteKeyReleased
    // TODO add your handling code here:
}//GEN-LAST:event_jTextFieldCodigoClienteKeyReleased

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonCancelar;
    private javax.swing.JButton jButtonFinalizarVenda;
    private javax.swing.JFormattedTextField jFormattedTextField1;
    private javax.swing.JFormattedTextField jFormattedTextFieldCPF;
    private javax.swing.JFormattedTextField jFormattedTextFieldDataEntrada;
    private javax.swing.JFormattedTextField jFormattedTextFieldDesconto;
    private javax.swing.JFormattedTextField jFormattedTextFieldTotal;
    private javax.swing.JLabel jLabelCPFCliente;
    private javax.swing.JLabel jLabelCodigoCliente;
    private javax.swing.JLabel jLabelDataSaida;
    private javax.swing.JLabel jLabelDesconto;
    private javax.swing.JLabel jLabelNomeCliente;
    private javax.swing.JLabel jLabelNomeVendedor;
    private javax.swing.JLabel jLabelNumero;
    private javax.swing.JLabel jLabelTotal;
    private javax.swing.JLabel jLabelVendedor;
    private javax.swing.JPanel jPanelInformacoesCliente;
    private javax.swing.JPanel jPanelInformacoesNota;
    private javax.swing.JPanel jPanelInformacoesVendedor;
    private javax.swing.JPanel jPanelTotal;
    private javax.swing.JScrollPane jScrollPaneProdutos;
    private javax.swing.JTable jTableProdutos;
    private javax.swing.JTextField jTextFieldCodigoCliente;
    private javax.swing.JTextField jTextFieldCodigoVendedor;
    private javax.swing.JTextField jTextFieldNomeCliente;
    private javax.swing.JTextField jTextFieldNomeVendedor;
    private javax.swing.JTextField jTextFieldNumero;
    // End of variables declaration//GEN-END:variables
}
